package com.engine.salary.entity.datacollection.bo;

import com.cloudstore.eccom.constant.WeaBoolAttr;
import com.cloudstore.eccom.pc.table.WeaTableColumn;
import com.engine.salary.constant.SalaryItemConstant;
import com.engine.salary.entity.datacollection.po.VariableItemPO;
import com.engine.salary.util.SalaryI18nUtil;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description: 浮动薪资档案
 * @Author: xzy
 */
public class VariableArchiveBO {

    @Override
    public String toString() {
        return "SalaryArchiveBO{}";
    }



    /**
     * 构建表格动态列
     *
     * @param variableItems
     */
    public static List<WeaTableColumn> buildVariableArchiveTable(List<VariableItemPO> variableItems) {
        // 表格表头
        List<WeaTableColumn> columns = new ArrayList<>();
        WeaTableColumn idColumn = new WeaTableColumn("100px", "id", "id");
        idColumn.setIsPrimarykey(WeaBoolAttr.TRUE);
        idColumn.setDisplay(WeaBoolAttr.FALSE);
        columns.add(idColumn);
        WeaTableColumn employeeIdColumn = new WeaTableColumn("100px", "人员信息表的主键id", "employeeId");
        employeeIdColumn.setDisplay(WeaBoolAttr.FALSE);
        columns.add(employeeIdColumn);
        columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(0, "薪资所属月"), "salaryMonth"));
        columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(85429, "个税扣缴义务人"), "taxAgentName"));
        columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(85429, "姓名"), "username"));
        columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86185, "部门"), "departmentName"));
        columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86186, "手机号"), "mobile"));
        columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86185, "工号"), "workcode"));
        columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86186, "证件号码"), "idNo"));
        columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86187, "入职日期"), "companystartdate"));
        for (VariableItemPO variableItem : variableItems) {
            columns.add(new WeaTableColumn("100px", variableItem.getName(), variableItem.getId() + SalaryItemConstant.VARIABLE_ITEM_DYNAMIC_SUFFIX));
        }

        return columns;
    }

//     /**
//      * 构建薪资档案数据
//      *
//      * @param salaryArchiveList
//      * @param salaryArchiveItemDataList
//      * @param localDateRange
//      * @param allEmployeeIds
//      * @param isOnlyTaxAgent
//      * @return
//      */
//     public static List<SalaryArchiveDataDTO> buildSalaryArchiveData(List<SalaryArchivePO> salaryArchiveList,
//                                                                     List<SalaryArchiveItemPO> salaryArchiveItemDataList,
//                                                                     LocalDateRange localDateRange,
//                                                                     List<Long> allEmployeeIds,
//                                                                     boolean isOnlyTaxAgent) {
//         // 开始日期
//         Date start = localDateRange.getFromDate();
//         // 结束日期
//         Date end = localDateRange.getEndDate();
//
//         List<SalaryArchiveDataDTO> list = new ArrayList<>();
//         allEmployeeIds.forEach(e -> {
//             // 同一个人的档案数据
//             List<SalaryArchivePO> salaryArchives = salaryArchiveList.stream().filter(f -> f.getEmployeeId().equals(e)).collect(Collectors.toList());
//             List<Long> salaryArchiveIds = salaryArchives.stream().map(SalaryArchivePO::getId).collect(Collectors.toList());
//             // 同一个人的薪资项目调整历史数据
//             List<SalaryArchiveItemPO> salaryArchiveItems = salaryArchiveItemDataList.stream().filter(d -> salaryArchiveIds.contains(d.getSalaryArchiveId())).collect(Collectors.toList());
//             List<Long> salaryArchiveItemIds = salaryArchiveItems.stream().map(SalaryArchiveItemPO::getSalaryItemId).distinct().collect(Collectors.toList());
//
//             SalaryArchiveDataDTO salaryArchiveData = new SalaryArchiveDataDTO();
//             salaryArchiveData.setEmployeeId(e);
//             List<SalaryArchiveTaxAgentDataDTO> taxAgents = new ArrayList<>();
//             // 按个税扣缴义务人生效日期时间段切割
//             for (SalaryArchivePO salaryArchive : salaryArchives) {
//                 Date fromDate = salaryArchive.getPayStartDate();
//                 Date endDate = salaryArchive.getPayEndDate();
//                 // 起始发薪日不为空，且不能比结束日期晚，最后发薪日可空可不空，但是如果不为空，就不能比开始日期早，且起始发薪日不能晚于最后发薪日
//                 boolean isEnable = fromDate != null && !fromDate.after(end) && (endDate == null || (!fromDate.after(endDate) && !endDate.before(start)));
//                 if (isEnable) {
//                     SalaryArchiveTaxAgentDataDTO taxAgent = new SalaryArchiveTaxAgentDataDTO();
//                     taxAgent.setTaxAgentId(salaryArchive.getTaxAgentId());
// //                    taxAgent.setIncomeCategory(salaryArchive.getIncomeCategory());
// //                    taxAgent.setSalarySobIds(salaryArchiveSobList.stream().filter(sob->sob.getSalaryArchiveId().equals(salaryArchive.getId())).map(SalaryArchiveSobPO::getSalarySobId).distinct().collect(Collectors.toList()));
//                     taxAgent.setEffectiveDateRange(LocalDateRange.builder().fromDate((fromDate.before(start) ? start : fromDate)).endDate(endDate == null || endDate.after(end) ? end : endDate).build());
//                     // 薪资项目数据按个税扣缴义务人切割
//                     if (!isOnlyTaxAgent) {
//                         // 开始日期
//                         Date startItem = taxAgent.getEffectiveDateRange().getFromDate();
//                         // 结束日期
//                         Date endItem = taxAgent.getEffectiveDateRange().getEndDate();
//                         Date endTempItem = endItem;
//                         List<SalaryArchiveItemDataDTO> salaryItemValues = new ArrayList<>();
//                         for (Long salaryArchiveItemId : salaryArchiveItemIds) {
//                             boolean flag = false;
//                             for (SalaryArchiveItemPO salaryArchiveItem : salaryArchiveItems) {
//                                 if (!salaryArchiveItemId.equals(salaryArchiveItem.getSalaryItemId()) || !salaryArchiveItem.getSalaryArchiveId().equals(salaryArchive.getId())) {
//                                     continue;
//                                 }
//                                 Date fromDateItem = salaryArchiveItem.getEffectiveTime();
//                                 if (fromDateItem.after(endTempItem) || endTempItem.before(startItem)) {
//                                     continue;
//                                 }
//                                 if (endTempItem.equals(startItem) && flag) {
//                                     continue;
//                                 }
//                                 SalaryArchiveItemDataDTO salaryArchiveItemData = new SalaryArchiveItemDataDTO();
//                                 salaryArchiveItemData.setEffectiveDateRange(LocalDateRange.builder().fromDate((fromDateItem.before(startItem) ? startItem : fromDateItem)).endDate(endTempItem).build());
//                                 salaryArchiveItemData.setSalaryItemId(salaryArchiveItem.getSalaryItemId());
//                                 salaryArchiveItemData.setValue(salaryArchiveItem.getItemValue());
//                                 salaryItemValues.add(salaryArchiveItemData);
//                                 flag = true;
//                                 endTempItem = fromDateItem;
//                             }
//                             endTempItem = endItem;
//                         }
//                         taxAgent.setSalaryItemValues(salaryItemValues);
//                     }
//                     taxAgents.add(taxAgent);
//                 }
//             }
//             salaryArchiveData.setTaxAgents(taxAgents);
//             list.add(salaryArchiveData);
//         });
//
//         return list;
//     }
//
//     /**
//      * 构建增量数据
//      *
//      * @param taxAgentEmpChangeList
//      * @param salaryArchiveList
//      * @param salaryArchiveItemList
//      * @param currentEmployeeId
//      */
//     public static ChangeData buildChangeData(List<TaxAgentEmpChangePO> taxAgentEmpChangeList, List<SalaryArchivePO> salaryArchiveList, List<SalaryArchiveItemPO> salaryArchiveItemList, Long currentEmployeeId) {
//         List<Long> changeIds = taxAgentEmpChangeList.stream().map(TaxAgentEmpChangePO::getId).collect(Collectors.toList());
//         // 根据个税扣缴义务人和人员以及增量类型分组
//         Map<String, Long> changeTypeMap = taxAgentEmpChangeList.stream().collect(Collectors.groupingBy(change -> change.getTaxAgentId() + "-" + change.getEmployeeId() + "-" + change.getChangeType(), Collectors.counting()));
//         // 顺序倒转
//         Collections.reverse(taxAgentEmpChangeList);
//         // 去重
//         taxAgentEmpChangeList = taxAgentEmpChangeList.stream()
//                 .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.getTaxAgentId() + "-" + f.getEmployeeId()))), ArrayList::new));
//         List<TaxAgentEmpChangePO> taxAgentEmpChanges = taxAgentEmpChangeList
//                 .stream()
//                 // 不相等则保留，否则忽略
//                 .filter(change -> !Objects.equals(changeTypeMap.get(change.getTaxAgentId() + "-" + change.getEmployeeId() + "-" + TaxAgentEmpChangeTypeEnum.ADD.getValue())
//                         , changeTypeMap.get(change.getTaxAgentId() + "-" + change.getEmployeeId() + "-" + TaxAgentEmpChangeTypeEnum.DEL.getValue())))
//                 .collect(Collectors.toList());
//
//         Date now = new Date();
//         Date today = new Date();
//         List<String> stopStatus = Arrays.asList(SalaryArchiveStatusEnum.STOP_FROM_PENDING.getValue(), SalaryArchiveStatusEnum.STOP_FROM_SUSPEND.getValue());
//         List<SalaryArchivePO> salaryArchiveAddTodoList = Lists.newArrayList();
//         List<SalaryArchivePO> salaryArchiveUpdateTodoList = Lists.newArrayList();
//         List<SalaryArchiveItemPO> salaryArchiveItemAddTodos = Lists.newArrayList();
//
//         Map<String, SalaryArchivePO> salaryArchiveListMap = SalaryEntityUtil.convert2Map(salaryArchiveList, k -> k.getTaxAgentId() + "-" + k.getEmployeeId());
//         taxAgentEmpChanges.forEach(change -> {
//             SalaryArchivePO salaryArchive = salaryArchiveListMap.get(change.getTaxAgentId() + "-" + change.getEmployeeId());
//             // 如果是新增 说明：如果没有档案，则新增，如果有档案而且是停薪，就挪到待定薪中，以个税扣缴义务人和人员id判断唯一
//             if (change.getChangeType() == TaxAgentEmpChangeTypeEnum.ADD.getValue()) {
//                 if (salaryArchive != null) {
//                     // 停薪中跳回待定薪：从a调动到b又调动到a，或者是删除待办后再覆盖
//                     if (stopStatus.contains(salaryArchive.getRunStatus())) {
//                         // 跳回待定薪
//                         salaryArchive.setRunStatus(SalaryArchiveStatusEnum.PENDING.getValue());
//                         if (salaryArchive.getRunStatus().equals(SalaryArchiveStatusEnum.STOP_FROM_SUSPEND.getValue())) {
//                             salaryArchive.setPayStartDate(today);
//                             salaryArchive.setPayEndDate(null);
//                         }
//                         salaryArchiveUpdateTodoList.add(salaryArchive);
//                         // 待停薪到停薪的就要复制最新的薪资项目
//                         if (salaryArchive.getRunStatus().equals(SalaryArchiveStatusEnum.STOP_FROM_SUSPEND.getValue())) {
//                             // 拷贝最新的薪资项目数据
//                             List<SalaryArchiveItemPO> salaryArchiveItemValuelList = salaryArchiveItemList.stream().filter(i -> i.getSalaryArchiveId().equals(salaryArchive.getId())).collect(Collectors.toList());
//                             salaryArchiveItemValuelList.forEach(i -> {
//                                 salaryArchiveItemAddTodos.add(SalaryArchiveItemPO.builder()
//                                         .id(IdGenerator.generate())
//                                         .salaryArchiveId(salaryArchive.getId())
//                                         .employeeId(salaryArchive.getEmployeeId())
//                                         .effectiveTime(today)
//                                         .adjustReason(SalaryArchiveItemAdjustReasonEnum.INIT.getValue())
//                                         .salaryItemId(i.getSalaryItemId())
//                                         .itemValue(i.getItemValue())
//                                         .description("")
//                                         // 不用设置操作人
//                                         .operateTime(now)
//                                         .createTime(now)
//                                         .updateTime(now)
//                                         .creator(currentEmployeeId)
//                                         .deleteType(NumberUtils.INTEGER_ZERO)
//                                         .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY)
//                                         .build());
//                             });
//                         }
//                     }
//                 } else {
//                     salaryArchiveAddTodoList.add(SalaryArchivePO.builder()
//                             .id(IdGenerator.generate())
//                             .employeeId(change.getEmployeeId())
//                             .taxAgentId(change.getTaxAgentId())
//                             .employeeType(change.getEmployeeType())
//                             .runStatus(SalaryArchiveStatusEnum.PENDING.getValue())
// //                            .incomeCategory(IncomeCategoryEnum.WAGES_AND_SALARIES.getValue())
// //                            .modifier(0L)
//                             .createTime(now)
//                             .updateTime(now)
//                             .creator(currentEmployeeId)
//                             .deleteType(NumberUtils.INTEGER_ZERO)
//                             .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY)
//                             .build());
//                 }
//                 // 如果是删除 说明：如果有档案并且是在定薪列表才处理，没档案不用管
//             } else if (change.getChangeType() == TaxAgentEmpChangeTypeEnum.DEL.getValue()) {
//                 if (salaryArchive != null) {
//                     if (salaryArchive.getRunStatus().equals(SalaryArchiveStatusEnum.FIXED.getValue())) {
//                         // 跳到待停薪
//                         salaryArchive.setRunStatus(SalaryArchiveStatusEnum.SUSPEND.getValue());
// //                        salaryArchive.setPayEndDate(today);
//                         salaryArchiveUpdateTodoList.add(salaryArchive);
//                     } else if (salaryArchive.getRunStatus().equals(SalaryArchiveStatusEnum.PENDING.getValue())) {
//                         // 跳到停薪
//                         salaryArchive.setRunStatus(SalaryArchiveStatusEnum.STOP_FROM_PENDING.getValue());
//                         salaryArchiveUpdateTodoList.add(salaryArchive);
//                     }
//                 }
//             }
//         });
//
//         return ChangeData.builder()
//                 .salaryArchiveAddTodoList(salaryArchiveAddTodoList)
//                 .salaryArchiveUpdateTodoList(salaryArchiveUpdateTodoList)
//                 .salaryArchiveItemAddTodos(salaryArchiveItemAddTodos)
//                 .changeIds(changeIds)
//                 .build();
//     }
//
//     @Data
//     @Builder
//     @NoArgsConstructor
//     @AllArgsConstructor
//     public static class ChangeData {
//
//         /**
//          * 批量修改薪资档案
//          */
//         private List<SalaryArchivePO> salaryArchiveAddTodoList;
//
//         /**
//          * 批量新增薪资档案
//          */
//         private List<SalaryArchivePO> salaryArchiveUpdateTodoList;
//
//         /**
//          * 落库处理薪资项目
//          */
//         private List<SalaryArchiveItemPO> salaryArchiveItemAddTodos;
//
//         /**
//          * 删除增量数据
//          */
//         private List<Long> changeIds;
//     }

}
